package leetcode;
/**
 * @author 美女
 * @date 2022/03/28 17:26
 **/

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

/**
 * 请你判断一个9x9的数独是否有效。只需要根据以下规则，验证已经填入的数字是否有效即可。
 * 数字1-9在每一行只能出现一次。
 * 数字1-9在每一列只能出现一次。
 * 数字1-9在每一个以粗实线分隔的3x3宫内只能出现一次。（请参考示例图）
 * 注意：
 * 一个有效的数独（部分已被填充）不一定是可解的。
 * 只需要根据以上规则，验证已经填入的数字是否有效即可。
 * 空白格用'.'表示。
 */
public class Num36_EffectiveShudu {
    public boolean isValidSudoku(char[][] board) {
        //将行列区域元素都用Map集合处理
        Map<Integer, Set<Integer>> row =new HashMap<>();
        Map<Integer,Set<Integer>> col=new HashMap<>();
        Map<Integer,Set<Integer>> area=new HashMap<>();
        //向集合中添加元素:将索引以及Set集合先存入
        for (int i = 0; i < 9; i++) {
            row.put(i,new HashSet<>());
            col.put(i,new HashSet<>());
            area.put(i,new HashSet<>());
        }
        //遍历数独行、列、区域中元素，判断是否有重复元素出现;如果有，则数独错误，否则正确
        //区域的索引index=(i/3)*3+j/3
        for (int i = 0; i < board.length; i++) {
            for (int j = 0; j < board[i].length; j++) {
                //每行每列对应元素
                char ch=board[i][j];
                int val=ch-'0';
                //area区域元素索引
                int index=(i/3)*3+j/3;
                if(ch!='.'){
                    //元素不是空格时
                    if(row.get(i).add(val)==false||col.get(j).add(val)==false||area.get(index).add(val)==false){
                        return false;
                    }
                    //走到这里表示val不存在在Set集合中，将val存入进行下一次判断
                    row.get(i).add(val);
                    col.get(j).add(val);
                    area.get(index).add(val);
                }
                }
        }
        return true;
    }
}
